package com.itcam.cm.manager.controller;


import com.itcam.cm.common.exception.ItcamException;
import com.itcam.cm.manager.service.SysMenuService;
import com.itcam.cm.manager.service.SysUserService;
import com.itcam.cm.manager.service.ValidateCodeService;
import com.itcam.cm.model.dto.system.LoginDto;
import com.itcam.cm.model.dto.system.SysMenuVo;
import com.itcam.cm.model.entity.system.SysUser;
import com.itcam.cm.model.entity.system.SysUserThreadLocalAuthContextUtil;
import com.itcam.cm.model.vo.common.Result;
import com.itcam.cm.model.vo.common.ResultCodeEnum;
import com.itcam.cm.model.vo.system.LoginVo;
import com.itcam.cm.model.vo.system.ValidateCodeVo;
import com.itcam.cm.util.AuthContextUtil;
import com.itcam.cm.util.ItcamAssert;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequestMapping("/admin/system/index")
@RestController
@Tag(name = "首页接口")
// 每一个controller类上都来添加这样的一个接口影响开发效率、维护性较差
@CrossOrigin(allowCredentials = "true", originPatterns = "*", allowedHeaders = "*") // maxAge默认值是30min
public class IndexController {

    @Autowired
    SysUserService sysUserService;

    @Autowired
    ValidateCodeService validateCodeService;

    @Autowired
    SysMenuService sysMenuService;

    /**
     * 处理用户登录请求
     * @param loginDto 包含用户登录信息的 DTO 对象，从请求体中获取
     * @param request HttpServletRequest 对象，用于获取请求的相关信息
     * @return 包含登录结果信息的 Result 对象
     */
    @Operation(summary = "用户登录")
    @PostMapping("/login")
    public Result<LoginVo> login(@RequestBody LoginDto loginDto/*, HttpServletRequest request*/) {
//        // 获取客户端的 IP 地址
//        String ip = request.getRemoteAddr();
//        // 调用业务层的登录方法，验证用户名和密码，并传入客户端 IP 地址
//        LoginVo loginVo = sysUserService.login(loginDto, ip);
//        // 断言登录结果不为空，如果为空则抛出异常，提示用户名或者密码错误
//        ItcamAssert.notNull(loginVo, "用户名或者密码错误");
//        // 返回包含登录结果信息的成功响应
//        return Result.ok(loginVo);
        try {
            LoginVo loginVo = sysUserService.login(loginDto);
            return Result.build(loginVo, ResultCodeEnum.SUCCESS);
        } catch (ItcamException e) {
            return Result.build(null, e.getResultCodeEnum());
        }
    }

    /**
     * 根据传入的 token 获取用户信息
     * 该方法通过从请求头中获取 token，调用 SysUserService 的 getUserInfo 方法查询用户信息
     * 并将查询结果封装在 Result 对象中返回
     *
     * @param token 从请求头中获取的 token，用于标识用户身份
     * @return 包含用户信息的 Result 对象，状态码为成功
     */
    @GetMapping("/getUserInfo")
    public Result<SysUser> getUserInfo(@RequestHeader String token) {
        // 调用 SysUserService 的 getUserInfo 方法，根据 token 查询用户信息
//        SysUser sysUser = sysUserService.getUserInfo(token);
        // 使用 Result.build 方法将查询到的用户信息和成功状态码封装在 Result 对象中并返回
        return Result.build(AuthContextUtil.get(), ResultCodeEnum.SUCCESS);
    }

    /**
     * 处理用户退出登录的请求
     * 该方法接收一个 token 作为请求头参数，调用业务层的退出登录方法
     * 并返回一个表示操作成功的结果对象
     *
     * @param token 从请求头中获取的用户令牌，用于标识用户身份
     * @return 一个包含操作结果的 Result 对象，状态码为成功，数据部分为 null
     */
    @Operation(summary = "用户退出")
    @Parameters(value = {
            @Parameter(name = "令牌参数", required = true)
    })
    @GetMapping(value = "/logout")
    public Result logout(@RequestHeader(value = "token") String token) {
        // 调用 SysUserService 的 logout 方法，传入 token 执行退出登录操作
        sysUserService.logout(token);
        // 使用 Result.build 方法构建一个表示操作成功的结果对象，数据部分为 null
        return Result.build(null, ResultCodeEnum.SUCCESS);
    }


//    @GetMapping("/getUserInfo")
//    public Result<SysUser> getUserInfo(HttpServletRequest request) {//@RequestHeader("token") String token
//        String token = request.getHeader("token");
//        // Cookie[] cookies = request.getCookies();
//        // 调用业务层查询用户信息
//        // SysUser sysUser = sysUserService.getUserInfo(token);
//        // 使用拦截器获得的用户信息
//        SysUser sysUser = SysUserThreadLocalAuthContextUtil.get();
//        return Result.ok(sysUser);
//    }

    /**
     * 生成验证码的接口方法
     * 该方法会调用 ValidateCodeService 中的 generateValidateCode 方法来生成验证码
     * 并将生成的验证码信息封装在 ValidateCodeVo 对象中返回
     *
     * @return 包含验证码信息的 Result 对象，状态为成功，数据为 ValidateCodeVo 类型
     */
    @GetMapping(value = "/generateValidateCode")
    public Result<ValidateCodeVo> generateValidateCode() {
        // 调用 ValidateCodeService 的 generateValidateCode 方法生成验证码
        ValidateCodeVo validateCodeVo = validateCodeService.generateValidateCode();
        // 将生成的验证码信息封装在 Result 对象中并返回
        return Result.ok(validateCodeVo);
    }


    @GetMapping("test1")
    public Result test1() {
        return Result.ok("功能测试接口1");
    }

//    public static void main(String[] args) {
//        CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(130, 50, 4, 10);
//        String key = "key";
//        String code = circleCaptcha.getCode();
//        String imageBase64Data = circleCaptcha.getImageBase64Data();// 图片的base64编码
//
//        System.out.println(key);
//        System.out.println(code);
//        System.out.println(imageBase64Data);
//    }

    @GetMapping("menus")
    public Result<List<SysMenuVo>> menus() {
        List<SysMenuVo> sysMenuVos = sysMenuService.menus();
        return Result.ok(sysMenuVos);
    }

}
